package br.com.naotebuk.controller;

import br.com.naotebuk.dao.UsuarioDao;
import br.com.naotebuk.modelo.Cargo;
import br.com.naotebuk.modelo.Usuario;
import br.com.naotebuk.propertyEditor.CargoPropertyEditor;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

/**
 *
 * @author giovanni
 */
@Transactional
@Controller
public class UsuarioController {

    @Autowired
    private UsuarioDao dao;

    @InitBinder
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
        binder.registerCustomEditor(Cargo.class, new CargoPropertyEditor(dao));
    }

    @RequestMapping("novoUsuario")
    public String form(Usuario usuario, Model model) {
        List<Cargo> cargos = dao.listarCargos();

        model.addAttribute("cargos", cargos);
        return "usuario/formulario";
    }

    @RequestMapping("adicionaUsuario")
    public String adiciona(@Valid Usuario usuario, BindingResult result, final RedirectAttributes redirectAttributes) {

        if (result.hasFieldErrors("email")) {
            return "usuario/formulario";
        }

        dao.adiciona(usuario);
        redirectAttributes.addFlashAttribute("sucesso", "true");
        redirectAttributes.addFlashAttribute("mensagem", "Usuário incluído com sucesso!");

        return "redirect:listaUsuarios";
    }

    @RequestMapping("listaUsuarios")
    public String lista(Model model) {
        List<Usuario> usuarios = dao.lista();

        model.addAttribute("usuarios", usuarios);

        return "usuario/lista";
    }

    @RequestMapping("buscaPorNome")
    public String listaComFiltro(String nome, Model model) {
        List<Usuario> usuarios = dao.buscarPorNome(nome);
        model.addAttribute("usuarios", usuarios);

        return "usuario/lista";
    }

    @RequestMapping("removeUsuario")
    public String remove(Integer id, final RedirectAttributes redirectAttributes) {
        dao.remove(dao.buscaPorId(id));
        redirectAttributes.addFlashAttribute("sucesso", "true");
        redirectAttributes.addFlashAttribute("mensagem", "Usuário removido com sucesso!");
        return "redirect:listaUsuarios";
    }

    @RequestMapping("mostraUsuario")
    public String mostra(Integer id, Model model) {
        List<Cargo> cargos = dao.listarCargos();
        model.addAttribute("cargos", cargos);
        model.addAttribute("usuario", dao.buscaPorId(id));
        return "usuario/mostra";
    }

    @RequestMapping("alteraUsuario")
    public String altera(Usuario usuario, final RedirectAttributes redirectAttributes) {
        usuario.setSenha(dao.buscaPorId(usuario.getId()).getSenha());
        dao.altera(usuario);

        redirectAttributes.addFlashAttribute("sucesso", "true");
        redirectAttributes.addFlashAttribute("mensagem", "Usuário alterado com sucesso!");

        return "redirect:listaUsuarios";
    }

    
    @RequestMapping("formularioSenha")
    public String formSenha(){
        return "usuario/formulario-senha";
    }

    @RequestMapping("alterarSenha")
    public String alterarSenha(HttpServletRequest request, Model model, String senha, String novaSenha, String confirmarSenha){
        Usuario usuario = new Usuario();
        usuario.setSenha(senha);
        Usuario usuarioLogado = (Usuario) request.getSession().getAttribute("usuarioLogado");
        if (!usuarioLogado.getSenha().equals(usuario.getSenha())){
            model.addAttribute("erro", true);
            model.addAttribute("mensagem", "A senha atual digitada não confere!\nFavor tentar novamente!");
            return "usuario/formulario-senha";
        }else if(!novaSenha.equals(confirmarSenha)){
            model.addAttribute("erro", true);
            model.addAttribute("mensagem", "A senha nova digitada não confere com a confirmação!\nFavor tentar novamente!");
            return "usuario/formulario-senha";
        }
        
        usuarioLogado.setSenha(novaSenha);
        dao.altera(usuarioLogado);
        model.addAttribute("sucesso", true);
        model.addAttribute("mensagem", "Senha alterada!");
        return "index";
    }
    
    @RequestMapping("detalheUsuario")
    public String detalheUsuario(Integer id, Model model) {
        Usuario usuario = dao.buscaPorId(id);
        model.addAttribute("usuario", usuario);
        return "usuario/detalhe";
    }


}
